package edu.zut.jpa_demo.repository;
import edu.zut.jpa_demo.entity.AyUser;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.data.repository.query.parser.PartTree;
import java.util.List;
//持久层接口
//JpaSpecificationExecutor<AyUser>: 这个接口可以帮助我们生成动态 SQL
public interface AyUserRepository extends JpaRepository<AyUser, Integer> , JpaSpecificationExecutor<AyUser> {

    /**
     * 利用jpa规范自定义查询PartTree
     * 方法遵循驼峰命名   xxxBy属性名称（首字母大写）
     */

    List<AyUser> findByNameLike(String name);   //根据名称进行模糊查询

    AyUser queryByMailAndName(String mail, String name);

    void removeByName(String name);  

    /*
    使用注解自定义sql （ JPQL查询）
    @Query :利用注解定义sql
     占位符：  ?位置  。在这里1代表 ？ 是第一个参数
     */
    @Query(value = "from AyUser where name like ?1%")
    List<AyUser> findAyUserByLikeName(String name);

    @Query(value = "from AyUser where name=?1 and mail=?2")
    AyUser findAyUserByNameAndMail(String name, String mail);


    /**
     * 自定义删除或修改
     *
     * @Modifying : 将查询修改为删除或更新操作
     */
    @Modifying
    @Query(value = "delete from AyUser where id=?1")
    void deleteAyUserById(Integer id);

    /**
     * @Param("name"): 进行参数的手动适配    sql中使用  :name格式
     */
    @Modifying
    @Query("update AyUser set name =:u_name  where id =:u_id")
    void updateAyUserById(@Param("u_name") String name, @Param("u_id") Integer id);

    //nativeQuery 默认是false,修改为true 的时候，使用的是原生 sql
    //用原生 sql 定义名字的模糊查询
    @Query(nativeQuery = true,value = "select * from ay_user where name like ?%")
    List<AyUser> findAyUserByLikeName2(String name);
}
